package org.luxor.commons.workflow.service;

import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.luxor.commons.workflow.entity.*;

import java.util.List;

/**
 * 任务管理
 *
 * @author Mr.yan  @date 2021/10/16
 */
public interface ITaskCoreService {

    /**
     * 待办事项-列表
     *
     * @param query 查询参数
     * @return java.util.List<java.lang.Object>
     */
    List<Task> listTodo(TodoTaskQuery query);

    /**
     * 在办事项-列表
     *
     * @param query 查询参数
     * @return java.util.List<java.lang.Object>
     */
    List<Task> listRun(RunTaskQuery query);

    /**
     * 已办事项-列表
     *
     * @param query 查询参数
     * @return java.util.List<java.lang.Object>
     */
    List<HistoricTaskInstance> listDone(DoneTaskQuery query);

    /**
     * 获取批注记录
     *
     * @param processInstanceId 流程实例ID
     * @return java.util.List<org.activiti.engine.task.Comment>
     */
    List<Comment> getProcessInstanceComments(String processInstanceId);

    /**
     * 领取任务
     * <p>
     * 明确任务的具体办理人(assignee)
     *
     * @param taskId 任务ID
     * @param userId 认领者用户ID,即:办理人
     * @return void
     */
    void claim(String taskId, String userId);

    /**
     * 取消领取
     *
     * @param taskId 任务ID
     * @return void
     */
    void unClaim(String taskId);

    /**
     * 完成办理
     * <p>
     * 代表审批通过，让流程自然流转到下个节点。
     *
     * @param completeTask
     * @return void
     */
    void complete(CompleteTask completeTask);

    /**
     * 驳回
     * <p>
     * 代表审批不通过,按要求退回到指定办理环节
     *
     * @param rejectTask
     * @return void
     */
    void reject(RejectTask rejectTask);

    /**
     * 撤回
     *
     * @param taskId 当前已办任务ID
     * @param userId 办理人
     * @param reason 撤回原因
     * @return void
     */
    void revoke(String taskId, String userId, String reason);

    /**
     * 指派
     * <p>
     * 完成任务处理，并指定目标任务的'办理人'、'候选人'、'候选组'
     *
     * @param assignTask
     * @return void
     */
    void assign(AssignTask assignTask);

    /**
     * 转办
     * <p>
     * 不处理任务，直接将任务转给其他候选人。
     *
     * @param turnTodoTask
     * @return void
     */
    void turnTodo(TurnTodoTask turnTodoTask);

    /**
     * 委托
     * <p>
     * 将任务委托给其他人解决，其他解决(resolve)完后，流回到委托人确认。
     *
     * @param delegateTask
     * @return void
     */
    void delegate(DelegateTask delegateTask);

    /**
     * 多实例任务-加签
     * <p>
     * 仅针对多实例会签节点下有效
     *
     * @param addMultiInstanceExecution 加签参数
     * @return
     */
    void addMultiInstanceExecution(AddMultiInstanceExecution addMultiInstanceExecution);

    /**
     * 多实例任务-减签
     * <p>
     * 仅针对多实例会签节点下有效
     *
     * @param deleteMultiInstanceExecution 减签参数
     */
    void deleteMultiInstanceExecution(DeleteMultiInstanceExecution deleteMultiInstanceExecution);

    /**
     * 任意任务-加(前)签
     *
     * <p>
     * 支持在任意用户节点进行加签，目前还存在1个遗漏问题
     * XXX 1、会导致该流程实例无法生成预览图
     *
     * @param addTaskInstanceExecution 加签参数
     * @return
     */
    void addBeforeTaskInstanceExecution(AddTaskInstanceExecution addTaskInstanceExecution);

    /**
     * 任意任务-加(后)签
     *
     * <p>
     * 支持在任意用户节点进行加签，目前还存在1个遗漏问题
     * XXX 1、会导致该流程实例无法生成预览图
     *
     * @param addTaskInstanceExecution 加签参数
     * @return
     */
    void addAfterTaskInstanceExecution(AddTaskInstanceExecution addTaskInstanceExecution);

    /**
     * 自由跳转
     *
     * @param jumpAnyWhereTask 自由跳转参数
     * @return void
     */
    void jump(JumpAnyWhereTask jumpAnyWhereTask);

}
